{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:03.268343Z",
     "start_time": "2025-03-08T12:54:03.262461Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=9, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.1\n",
      "numpy 2.0.1\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cu126\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 63
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.090883Z",
     "start_time": "2025-03-08T12:54:03.654257Z"
    }
   },
   "source": [
    "from tensorflow import keras  #这里的波浪线不用管\n",
    "\n",
    "#用karas有的数据集imdb，电影分类,分电影是积极的，还是消极的，正常都可以下载成功\n",
    "imdb = keras.datasets.imdb\n",
    "#载入数据使用下面两个参数\n",
    "vocab_size = 10000  #词典大小，仅保留训练数据中前10000个最经常出现的单词，低频单词被舍弃\n",
    "index_from = 3  #0,1,2,3空出来做别的事\n",
    "#前一万个词出现词频最高的会保留下来进行处理，后面的作为特殊字符处理，\n",
    "# 小于3的id都是特殊字符，下面代码有写\n",
    "# 需要注意的一点是取出来的词表还是从1开始的，需要做处理\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(\n",
    "    num_words=vocab_size, index_from=index_from)"
   ],
   "outputs": [],
   "execution_count": 64
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_labels)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.095826Z",
     "start_time": "2025-03-08T12:54:08.091865Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numpy.ndarray"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 65
  },
  {
   "cell_type": "code",
   "source": [
    "print(type(train_data))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.101654Z",
     "start_time": "2025-03-08T12:54:08.096820Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'>\n"
     ]
    }
   ],
   "execution_count": 66
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.107352Z",
     "start_time": "2025-03-08T12:54:08.102645Z"
    }
   },
   "cell_type": "code",
   "source": "train_data.shape  #每个样本是一段话，每个单词用一个数字表示",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25000,)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 67
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_data[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.112521Z",
     "start_time": "2025-03-08T12:54:08.107352Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "list"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 68
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.119115Z",
     "start_time": "2025-03-08T12:54:08.113515Z"
    }
   },
   "cell_type": "code",
   "source": "train_data[1]",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1,\n",
       " 194,\n",
       " 1153,\n",
       " 194,\n",
       " 8255,\n",
       " 78,\n",
       " 228,\n",
       " 5,\n",
       " 6,\n",
       " 1463,\n",
       " 4369,\n",
       " 5012,\n",
       " 134,\n",
       " 26,\n",
       " 4,\n",
       " 715,\n",
       " 8,\n",
       " 118,\n",
       " 1634,\n",
       " 14,\n",
       " 394,\n",
       " 20,\n",
       " 13,\n",
       " 119,\n",
       " 954,\n",
       " 189,\n",
       " 102,\n",
       " 5,\n",
       " 207,\n",
       " 110,\n",
       " 3103,\n",
       " 21,\n",
       " 14,\n",
       " 69,\n",
       " 188,\n",
       " 8,\n",
       " 30,\n",
       " 23,\n",
       " 7,\n",
       " 4,\n",
       " 249,\n",
       " 126,\n",
       " 93,\n",
       " 4,\n",
       " 114,\n",
       " 9,\n",
       " 2300,\n",
       " 1523,\n",
       " 5,\n",
       " 647,\n",
       " 4,\n",
       " 116,\n",
       " 9,\n",
       " 35,\n",
       " 8163,\n",
       " 4,\n",
       " 229,\n",
       " 9,\n",
       " 340,\n",
       " 1322,\n",
       " 4,\n",
       " 118,\n",
       " 9,\n",
       " 4,\n",
       " 130,\n",
       " 4901,\n",
       " 19,\n",
       " 4,\n",
       " 1002,\n",
       " 5,\n",
       " 89,\n",
       " 29,\n",
       " 952,\n",
       " 46,\n",
       " 37,\n",
       " 4,\n",
       " 455,\n",
       " 9,\n",
       " 45,\n",
       " 43,\n",
       " 38,\n",
       " 1543,\n",
       " 1905,\n",
       " 398,\n",
       " 4,\n",
       " 1649,\n",
       " 26,\n",
       " 6853,\n",
       " 5,\n",
       " 163,\n",
       " 11,\n",
       " 3215,\n",
       " 2,\n",
       " 4,\n",
       " 1153,\n",
       " 9,\n",
       " 194,\n",
       " 775,\n",
       " 7,\n",
       " 8255,\n",
       " 2,\n",
       " 349,\n",
       " 2637,\n",
       " 148,\n",
       " 605,\n",
       " 2,\n",
       " 8003,\n",
       " 15,\n",
       " 123,\n",
       " 125,\n",
       " 68,\n",
       " 2,\n",
       " 6853,\n",
       " 15,\n",
       " 349,\n",
       " 165,\n",
       " 4362,\n",
       " 98,\n",
       " 5,\n",
       " 4,\n",
       " 228,\n",
       " 9,\n",
       " 43,\n",
       " 2,\n",
       " 1157,\n",
       " 15,\n",
       " 299,\n",
       " 120,\n",
       " 5,\n",
       " 120,\n",
       " 174,\n",
       " 11,\n",
       " 220,\n",
       " 175,\n",
       " 136,\n",
       " 50,\n",
       " 9,\n",
       " 4373,\n",
       " 228,\n",
       " 8255,\n",
       " 5,\n",
       " 2,\n",
       " 656,\n",
       " 245,\n",
       " 2350,\n",
       " 5,\n",
       " 4,\n",
       " 9837,\n",
       " 131,\n",
       " 152,\n",
       " 491,\n",
       " 18,\n",
       " 2,\n",
       " 32,\n",
       " 7464,\n",
       " 1212,\n",
       " 14,\n",
       " 9,\n",
       " 6,\n",
       " 371,\n",
       " 78,\n",
       " 22,\n",
       " 625,\n",
       " 64,\n",
       " 1382,\n",
       " 9,\n",
       " 8,\n",
       " 168,\n",
       " 145,\n",
       " 23,\n",
       " 4,\n",
       " 1690,\n",
       " 15,\n",
       " 16,\n",
       " 4,\n",
       " 1355,\n",
       " 5,\n",
       " 28,\n",
       " 6,\n",
       " 52,\n",
       " 154,\n",
       " 462,\n",
       " 33,\n",
       " 89,\n",
       " 78,\n",
       " 285,\n",
       " 16,\n",
       " 145,\n",
       " 95]"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 69
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.125092Z",
     "start_time": "2025-03-08T12:54:08.120098Z"
    }
   },
   "cell_type": "code",
   "source": "len(train_data[0])",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "218"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 70
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.130205Z",
     "start_time": "2025-03-08T12:54:08.126085Z"
    }
   },
   "cell_type": "code",
   "source": "len(train_data[1])",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "189"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 71
  },
  {
   "cell_type": "code",
   "source": [
    "train_labels[0:10]  #二分类"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.135323Z",
     "start_time": "2025-03-08T12:54:08.131198Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0, 0, 1, 0, 0, 1, 0, 1, 0])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 72
  },
  {
   "cell_type": "code",
   "source": [
    "print(\"train\", len(train_data), train_labels.shape)  #25000个样本，每个样本是一段话，每个单词用一个数字表示\n",
    "print(\"test\", len(test_data), test_labels.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.142580Z",
     "start_time": "2025-03-08T12:54:08.137314Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train 25000 (25000,)\n",
      "test 25000 (25000,)\n"
     ]
    }
   ],
   "execution_count": 73
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.208626Z",
     "start_time": "2025-03-08T12:54:08.143576Z"
    }
   },
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典\n",
    "word_index = imdb.get_word_index()\n",
    "print(len(word_index))\n",
    "print(type(word_index))\n",
    "#词表虽然有8万多，但是我们只载入了最高频的1万词！！！！"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "88584\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "execution_count": 74
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构造 word2idx 和 idx2word"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.239731Z",
     "start_time": "2025-03-08T12:54:08.209617Z"
    }
   },
   "source": [
    "word2idx = {word: idx + 3 for word, idx in word_index.items()}  # 0,1,2,3空出来做别的事,这里的idx是从1开始的,所以加3\n",
    "word2idx.update({\n",
    "    \"[PAD]\": 0,  # 填充 token\n",
    "    \"[BOS]\": 1,  # begin of sentence\n",
    "    \"[UNK]\": 2,  # 未知 token\n",
    "    \"[EOS]\": 3,  # end of sentence\n",
    "})\n",
    "\n",
    "idx2word = {idx: word for word, idx in word2idx.items()}  # 反向词典,id变为单词"
   ],
   "outputs": [],
   "execution_count": 75
  },
  {
   "cell_type": "code",
   "source": "print(word2idx[\"like\"]) #随便输入一个单词就会变成id",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.243677Z",
     "start_time": "2025-03-08T12:54:08.240729Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "40\n"
     ]
    }
   ],
   "execution_count": 76
  },
  {
   "cell_type": "code",
   "source": "idx2word[40] #id变为单词",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:08.249445Z",
     "start_time": "2025-03-08T12:54:08.245182Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'like'"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 77
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:09.806508Z",
     "start_time": "2025-03-08T12:54:08.250437Z"
    }
   },
   "source": [
    "# 选择 max_length\n",
    "length_collect = {}\n",
    "#统计样本中每个长度出现的次数\n",
    "for text in train_data:\n",
    "    length = len(text)  #句子长度\n",
    "    length_collect[length] = length_collect.get(length, 0) + 1  #统计长度的频率\n",
    "\n",
    "MAX_LENGTH = 500\n",
    "plt.bar(length_collect.keys(), length_collect.values())  #长度分布图\n",
    "plt.axvline(MAX_LENGTH, label=\"max length\", c=\"gray\", ls=\":\")  #画一条线，可以看到大部分都在500以内\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGdCAYAAAA44ojeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAO+RJREFUeJzt3Xl4FFW+//FPb4mJZjGBbGPYlUUCAmqIC8IlCnFFcAYUHVAGRAMjoIjxqqDee8Oo4zKKOI4Kziji6GVxcMSHHZeAgCAgiIAoqAkwMiQskvRyfn94qZ8t6UCgU90N79fz1OPpqtPV3zq0qW+fU3XKYYwxAgAAiCLOSAcAAADwSyQoAAAg6pCgAACAqEOCAgAAog4JCgAAiDokKAAAIOqQoAAAgKhDggIAAKKOO9IBHI9AIKDvv/9eSUlJcjgckQ4HAAAcA2OM9u3bp5ycHDmddfeRxGSC8v333ys3NzfSYQAAgOOwY8cOnXXWWXXWickEJSkpSdJPB5icnBzhaAAAwLGoqqpSbm6udR6vS0wmKIeHdZKTk0lQYojf79eyZcskSV27dpXL5YpwRACASDiWyzNiMkFBbPL7/Zo/f74k6YILLiBBAQCERIIC2zidTnXs2NEqAwAQCgkKbON2u9WnT59IhwEAiAH1SlBKS0s1Y8YMffHFF0pISNBFF12kP/zhD2rdurVV59ChQ7r77rs1ffp0VVdXq1evXnr++eeVmZlp1dm+fbvuuOMOLVq0SGeccYYGDRqk0tJSud3kSwBwMjDGyOfzye/3RzoU2MjlcsntdodlCpB6ZQRLlixRcXGxLrjgAvl8Pt1///264oortGHDBp1++umSpNGjR+vdd9/VW2+9pZSUFI0YMUJ9+/bVRx99JOmn6xCuuuoqZWVl6eOPP1Z5ebl++9vfyuPx6H/+539O+IAAAJFVU1Oj8vJyHTx4MNKhIAISExOVnZ2tuLi4E9qPwxhjjvfNu3fvVkZGhpYsWaJu3bqpsrJSjRs31rRp03TDDTdIkr744gu1bdtWZWVl6tq1q9577z1dffXV+v77761elRdeeEHjxo3T7t27j+mAqqqqlJKSosrKSu7iiSE1NTV68sknJUljxow54S8vgOgTCAS0efNmuVwuNW7cWHFxcUyoeYowxqimpka7d++W3+/X2WeffcT1hvU5f5/QmEplZaUkKS0tTZK0atUqeb1eFRYWWnXatGmjJk2aWAlKWVmZ8vLygoZ8evXqpTvuuEOff/65OnXqdMTnVFdXq7q6OugAEZt+/u8I4ORTU1OjQCCg3NxcJSYmRjoc2CwhIUEej0fffPONampqdNpppx33vo47QQkEAho1apQuvvhitW/fXpJUUVGhuLg4paamBtXNzMxURUWFVefnycnh7Ye31aa0tFQPP/zw8YaKKOHxeDRixAirDODkxZ16p65w/dsf916Ki4u1fv16TZ8+PSyB1KWkpESVlZXWsmPHjgb/TISfw+FQenq60tPT6fIFANTpuBKUESNGaM6cOVq0aFHQXPpZWVmqqanR3r17g+rv3LlTWVlZVp2dO3cesf3wttrEx8dbs8YyeywA4GTncDg0a9asSIchSZowYYLOO+882z+3XgmKMUYjRozQzJkztXDhQjVv3jxoe5cuXeTxeLRgwQJr3aZNm7R9+3YVFBRIkgoKCrRu3Trt2rXLqjNv3jwlJyerXbt2J3IsiHJ+v1+ffPKJPvnkE249BIAoFE2JUb2uQSkuLta0adM0e/ZsJSUlWdeMpKSkKCEhQSkpKRoyZIjGjBmjtLQ0JScna+TIkSooKFDXrl0lSVdccYXatWunW265RY899pgqKir0wAMPqLi4WPHx8eE/QkQNv9+v9957T5J03nnnMdU9ACCkevWgTJ48WZWVlerevbuys7Ot5c0337TqPPXUU7r66qvVr18/devWTVlZWZoxY4a13eVyac6cOXK5XCooKNDNN9+s3/72t3rkkUfCd1SISk6nU+3atVO7du24gA5A1OnevbtGjhypUaNG6cwzz1RmZqb+8pe/6MCBA7r11luVlJSkVq1aWT+0pJ9+eA0ZMkTNmzdXQkKCWrdurWeeecbafujQIZ177rkaNmyYtW7r1q1KSkrSK6+8csyx7dixQ7/5zW+UmpqqtLQ0XXfddfr666+t7YMHD1afPn30xBNPKDs7W+np6SouLpbX67XqlJeX66qrrlJCQoKaN2+uadOmqVmzZnr66aclSc2aNZMkXX/99XI4HNbrw/72t7+pWbNmSklJ0YABA7Rv375jjv+4mBhUWVlpJJnKyspIhwIA+Jkff/zRbNiwwfz4449HbKuurjbV1dUmEAhY63w+n6murjZerzesdY/HZZddZpKSksyjjz5qvvzyS/Poo48a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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 78
  },
  {
   "cell_type": "code",
   "source": [
    "#想对句子长度画个直方图，看看长度分布\n",
    "length_list = [len(text) for text in train_data]\n",
    "plt.hist(length_list, bins=50)\n",
    "plt.xlabel(\"length\")\n",
    "plt.ylabel(\"frequency\")\n",
    "plt.axvline(500, label=\"max length\", c=\"gray\", ls=\":\")\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.011687Z",
     "start_time": "2025-03-08T12:54:09.806508Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 79
  },
  {
   "cell_type": "markdown",
   "source": [],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "source": [
    "length_list[0:10]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.016611Z",
     "start_time": "2025-03-08T12:54:10.012684Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[218, 189, 141, 550, 147, 43, 123, 562, 233, 130]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 80
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.023229Z",
     "start_time": "2025-03-08T12:54:10.017605Z"
    }
   },
   "cell_type": "code",
   "source": [
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "raw_text"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['hello', 'world'],\n",
       " ['tokenize', 'text', 'datas', 'with', 'batch'],\n",
       " ['this', 'is', 'a', 'test']]"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 81
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.038812Z",
     "start_time": "2025-03-08T12:54:10.024224Z"
    }
   },
   "source": [
    "class Tokenizer:\n",
    "    def __init__(self, word2idx, idx2word, max_length=500, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx  #词表,单词到id\n",
    "        self.idx2word = idx2word  #词表，id到单词\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx  #填充\n",
    "        self.bos_idx = bos_idx  #开始\n",
    "        self.eos_idx = eos_idx  #结束\n",
    "        self.unk_idx = unk_idx  #未知，未出现在最高频词表中的词\n",
    "\n",
    "    def encode(self, text_list):\n",
    "        \"\"\"\n",
    "        将文本列表转化为索引列表，类型必须是二维字符串列表\n",
    "        :param text_list:当前批次的文本列表，text_list必须是一个二维的字符串列表\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        max_length = min(self.max_length, 2 + max(\n",
    "            [len(text) for text in text_list]))  #最大长度，最大长度是500，但是如果当前批次所有句子长度都小于500，就取句子长度（句子长度是本组句子中最长的那个），2是为了留出开始和结束的位置\n",
    "        #为什么要用批次里面的最大长度，因为其他的用pad填充，有超过的就截断\n",
    "        indices = [] # 索引列表\n",
    "        for text in text_list:\n",
    "            index = [self.word2idx.get(word, self.unk_idx) for word in text]  #单词转化为id，未知的词用unk_idx代替\n",
    "            index = [self.bos_idx] + index + [self.eos_idx]  #添加开始和结束\n",
    "            if len(index) < max_length:\n",
    "                index = index + [self.pad_idx] * (max_length - len(index))  #填充0\n",
    "            else:\n",
    "                index = index[:max_length]  #如果句子长度大于500，就截断\n",
    "            indices.append(index)\n",
    "        return torch.tensor(indices)  #二维列表转化为tensor\n",
    "\n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        \"\"\"\n",
    "        将索引列表转化为文本列表\n",
    "        :param indices_list:某批次的索引列表\n",
    "        :param remove_bos:\n",
    "        :param remove_eos:\n",
    "        :param remove_pad:\n",
    "        :param split:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            text = []\n",
    "            for index in indices:\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                if remove_bos and word == \"[BOS]\":\n",
    "                    continue\n",
    "                if remove_eos and word == \"[EOS]\":\n",
    "                    break\n",
    "                if remove_pad and word == \"[PAD]\":\n",
    "                    break\n",
    "                text.append(word)\n",
    "            text_list.append(\" \".join(text) if not split else text)\n",
    "        return text_list\n",
    "\n",
    "\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text)  #encode支持批量处理\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([   1, 4825,  182,    3,    0,    0,    0])\n",
      "tensor([    1,     2,  3004,     2,    19, 19233,     3])\n",
      "tensor([   1,   14,    9,    6, 2181,    3,    0])\n"
     ]
    }
   ],
   "execution_count": 82
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.043804Z",
     "start_time": "2025-03-08T12:54:10.039806Z"
    }
   },
   "cell_type": "code",
   "source": [
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "print(\"decode text----------\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "decode text----------\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with batch [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "execution_count": 83
  },
  {
   "cell_type": "code",
   "source": [
    "train_data[0:1]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.049323Z",
     "start_time": "2025-03-08T12:54:10.044796Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([list([1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32])],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 84
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.055105Z",
     "start_time": "2025-03-08T12:54:10.050316Z"
    }
   },
   "cell_type": "code",
   "source": "train_data[0:1]",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([list([1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32])],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 85
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:10.059938Z",
     "start_time": "2025-03-08T12:54:10.056098Z"
    }
   },
   "source": [
    "# 看看训练集的数据\n",
    "tokenizer.decode(train_data[0:1], remove_bos=False, remove_eos=False, remove_pad=False)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[\"[BOS] this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert [UNK] is an amazing actor and now the same being director [UNK] father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for [UNK] and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also [UNK] to the two little boy's that played the [UNK] of norman and paul they were just brilliant children are often left out of the [UNK] list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\"]"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 86
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集与 DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:11.594864Z",
     "start_time": "2025-03-08T12:54:10.060932Z"
    }
   },
   "source": [
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "class IMDBDataset(Dataset):\n",
    "    def __init__(self, data, labels, remain_length=True):\n",
    "        if remain_length:  #字符串输出样本中，是否含有【BOS】和【EOS】，【PAD】\n",
    "            self.data = tokenizer.decode(data, remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "        else:\n",
    "            # 缩减一下数据\n",
    "            self.data = tokenizer.decode(data)\n",
    "        self.labels = labels\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        text = self.data[index]\n",
    "        label = self.labels[index]\n",
    "        return text, label\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.data)\n",
    "\n",
    "\n",
    "def collate_fct(batch):\n",
    "    \"\"\"\n",
    "    将batch数据处理成tensor形式\n",
    "    :param batch:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    text_list = [item[0].split() for item in batch]  #batch是128样本，每个样本类型是元组，第一个元素是文本，第二个元素是标签\n",
    "    label_list = [item[1] for item in batch]\n",
    "    text_list = tokenizer.encode(text_list).to(dtype=torch.int)  # 文本转化为索引\n",
    "    return text_list, torch.tensor(label_list).reshape(-1, 1).to(dtype=torch.float)\n",
    "\n",
    "\n",
    "train_ds = IMDBDataset(train_data, train_labels)\n",
    "test_ds = IMDBDataset(test_data, test_labels)"
   ],
   "outputs": [],
   "execution_count": 87
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:11.599089Z",
     "start_time": "2025-03-08T12:54:11.595865Z"
    }
   },
   "source": [
    "batch_size = 28\n",
    "train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True, collate_fn=collate_fct)  #collate_fn是处理batch的函数\n",
    "test_dl = DataLoader(test_ds, batch_size=batch_size, shuffle=False, collate_fn=collate_fct)"
   ],
   "outputs": [],
   "execution_count": 88
  },
  {
   "cell_type": "code",
   "source": [
    "#要看到每个batch的长度不同，需要修改batch_size为12\n",
    "i=0\n",
    "for text, label in train_dl:\n",
    "    print(text.shape, label.shape)\n",
    "    i+=1\n",
    "    if i==1000:\n",
    "        break"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.276672Z",
     "start_time": "2025-03-08T12:54:11.600084Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 473]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 455]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 457]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 483]) torch.Size([28, 1])\n",
      "torch.Size([28, 468]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 491]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 447]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 398]) torch.Size([28, 1])\n",
      "torch.Size([28, 491]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 483]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 489]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 496]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 483]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 353]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 370]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 498]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 494]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 434]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 452]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 421]) torch.Size([28, 1])\n",
      "torch.Size([28, 425]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 466]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 481]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 432]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 459]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 407]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 467]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 464]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 445]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 426]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 480]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 499]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 467]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 426]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 418]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 486]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 361]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 444]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 428]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 462]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 473]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 294]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 367]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 334]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 378]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 491]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 329]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 398]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 429]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 498]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 428]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 371]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 453]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 494]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 487]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 475]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 483]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 445]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 407]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 351]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 473]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 354]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 371]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 460]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 436]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 471]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 456]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 430]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([28, 500]) torch.Size([28, 1])\n",
      "torch.Size([24, 500]) torch.Size([24, 1])\n"
     ]
    }
   ],
   "execution_count": 89
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义模型"
   ]
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.281413Z",
     "start_time": "2025-03-08T12:54:15.277663Z"
    }
   },
   "cell_type": "code",
   "source": "(128,500,10000)",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(128, 500, 10000)"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 90
  },
  {
   "cell_type": "code",
   "source": [
    "# target output size of 5\n",
    "m = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化\n",
    "input = torch.randn(1, 3, 9)\n",
    "output = m(input)\n",
    "output.size()  #可以看到最后一维变成了1"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.289607Z",
     "start_time": "2025-03-08T12:54:15.285401Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 3, 1])"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 91
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.297820Z",
     "start_time": "2025-03-08T12:54:15.290526Z"
    }
   },
   "source": [
    "class AddingModel(nn.Module):\n",
    "    def __init__(self, embedding_dim=16, hidden_dim=64, vocab_size=vocab_size):\n",
    "        super(AddingModel, self).__init__()\n",
    "        self.embeding = nn.Embedding(vocab_size, embedding_dim)  # 词嵌入\n",
    "        self.pool = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化,对应tf是全局平均值池化\n",
    "        self.layer = nn.Linear(embedding_dim, hidden_dim)  # 全连接层\n",
    "        self.fc = nn.Linear(hidden_dim, 1)  # 全连接层\n",
    "\n",
    "    def forward(self, x):\n",
    "        # [bs, seq length] [128, 500] --->[128,500,16]\n",
    "        x = self.embeding(x)\n",
    "        # print(f'embeding x size:{x.shape}')\n",
    "        # [bs, seq length, embedding_dim]-->[bs, embedding_dim, seq length]，尺寸[128,500,16]--》[128,16,500]\n",
    "        x = x.permute(0, 2, 1)\n",
    "        # print(f'permute x size:{x.shape}')\n",
    "        x = self.pool(x)  # 每个样本变为一个密集向量，在seq_length维度上进行平均池化，[128,16,500]-->[128,16,1]\n",
    "        # print(f'pool x size:{x.shape}')\n",
    "        x=x.squeeze(2)  # [bs, embedding_dim, 1] ->[bs, embedding_dim]\n",
    "        # [bs, embedding_dim] -> [bs, hidden_dim]\n",
    "        x = self.layer(x)\n",
    "        x = self.fc(x)  # [bs, hidden_dim] -> [bs, 1]\n",
    "\n",
    "        return x\n",
    "\n",
    "\n",
    "for key, value in AddingModel().named_parameters():\n",
    "    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            embeding.weight             paramerters num: 160000\n",
      "              layer.weight              paramerters num: 1024\n",
      "               layer.bias               paramerters num: 64\n",
      "               fc.weight                paramerters num: 64\n",
      "                fc.bias                 paramerters num: 1\n"
     ]
    }
   ],
   "execution_count": 92
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.304342Z",
     "start_time": "2025-03-08T12:54:15.298814Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#统计总参数量\n",
    "print(sum([np.prod(value.shape) for key, value in AddingModel().named_parameters()]))"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "161153\n"
     ]
    }
   ],
   "execution_count": 93
  },
  {
   "cell_type": "code",
   "source": [
    "16 * 64"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.309185Z",
     "start_time": "2025-03-08T12:54:15.305338Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1024"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 94
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.320726Z",
     "start_time": "2025-03-08T12:54:15.310175Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#随机一个tensor，做上面模型的forward\n",
    "#随机一个tensor,尺寸128,500，值必须在0-10000之间\n",
    "x = torch.randint(0, 10000, (128, 500)).to(dtype=torch.int)\n",
    "AddingModel()(x).shape "
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([128, 1])"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 95
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.839230Z",
     "start_time": "2025-03-08T12:54:15.321722Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device) \n",
    "        # 前向计算\n",
    "        logits = model(datas) \n",
    "        loss = loss_fct(logits, labels)  # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        # 二分类 ，因为sigmoid输入是大于0的话，得到的概率是大于0.5的，认为是1分类\n",
    "        preds = logits > 0 \n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 96
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### TensorBoard 可视化\n",
    "\n",
    "\n",
    "训练过程中可以使用如下命令启动tensorboard服务。\n",
    "\n",
    "```shell\n",
    "tensorboard \\\n",
    "    --logdir=runs \\     # log 存放路径\n",
    "    --host 0.0.0.0 \\    # ip\n",
    "    --port 8848         # 端口\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.846716Z",
     "start_time": "2025-03-08T12:54:15.840213Z"
    }
   },
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "\n",
    "        )\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ],
   "outputs": [],
   "execution_count": 97
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Save Best\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.853695Z",
     "start_time": "2025-03-08T12:54:15.847712Z"
    }
   },
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = -1\n",
    "\n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ],
   "outputs": [],
   "execution_count": 98
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Early Stop"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:54:15.860690Z",
     "start_time": "2025-03-08T12:54:15.854694Z"
    }
   },
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0\n",
    "\n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else:\n",
    "            self.counter += 1\n",
    "\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ],
   "outputs": [],
   "execution_count": 99
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:56:54.732720Z",
     "start_time": "2025-03-08T12:54:15.863679Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(\n",
    "        model,\n",
    "        train_loader,\n",
    "        val_loader,\n",
    "        epoch,\n",
    "        loss_fct,\n",
    "        optimizer,\n",
    "        tensorboard_callback=None,\n",
    "        save_ckpt_callback=None,\n",
    "        early_stop_callback=None,\n",
    "        eval_step=500,\n",
    "):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits > 0 #当sigmoid输出大于0.5时，预测为1，否则预测为0，这里大于0，刚好sigmoid的值是0.5，预测为1\n",
    "\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())\n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step,\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"],\n",
    "                        )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "\n",
    "    return record_dict\n",
    "\n",
    "\n",
    "epoch = 20\n",
    "\n",
    "model = AddingModel()\n",
    "\n",
    "# 1. 定义损失函数 采用二进制交叉熵损失, 先sigmoid再计算交叉熵\n",
    "loss_fct = F.binary_cross_entropy_with_logits\n",
    "# loss_fct =nn.BCEWithLogitsLoss()\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "tensorboard_callback = TensorBoardCallback(\"runs/imdb-adding\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints/imdb-adding\", save_step=len(train_dl), save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=5)\n",
    "\n",
    "model = model.to(device)\n",
    "record = training(\n",
    "    model,\n",
    "    train_dl,\n",
    "    test_dl,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=len(train_dl)\n",
    ")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/17860 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "b4f6bde5e867464fb0355e3dc8eecd91"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 10 / global_step 8930\n"
     ]
    }
   ],
   "execution_count": 100
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:56:54.997779Z",
     "start_time": "2025-03-08T12:56:54.733677Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        # axs[idx].set_xticks(range(0, train_df.index[-1], 5000))\n",
    "        # axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, train_df.index[-1], 5000)))\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record, sample_step=10)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 101
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-08T12:57:01.757766Z",
     "start_time": "2025-03-08T12:56:54.998724Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/imdb-adding/best.ckpt\", weights_only=True,map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, test_dl, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3317\n",
      "accuracy: 0.8772\n"
     ]
    }
   ],
   "execution_count": 102
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
